package siafi.servlet;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JasperRunManager;

import org.apache.log4j.Logger;

import siafi.bean.Concepto;
import siafi.bean.PersonaCentro;
import siafi.bean.Servicio;
import siafi.db.ConexionDB;
import siafi.db.Procedimientos;
import siafi.db.TerceroDAO;
import siafi.util.Constantes;

/**
 * Servlet implementation class GenerarReciboServicio
 */
public class GenerarReciboServicio extends HttpServlet {
	private static final long serialVersionUID = 1L;
	

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public GenerarReciboServicio() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		Logger log = Logger.getLogger(GenerarReciboServicio.class);
		@SuppressWarnings("unchecked")
		Enumeration<String> nombres = request.getParameterNames();
		List<String> servicios = new ArrayList<String>();
		String ntemp;
		String resultado = "Recibo generado exitosamente";
		/*
		 * while(nombres.hasMoreElements()){ ntemp = nombres.nextElement();
		 * if(ntemp.indexOf("servicio-") != -1)
		 * servicios.add(ntemp.substring(ntemp.indexOf("-")+1)); }
		 */
		List<Servicio> serviciosList = (List<Servicio>) request.getSession().getAttribute("servicios");
		/*
		 * List<Servicio> serviciosList = new ArrayList<Servicio>(); for(String
		 * s : servicios){ Servicio servicio =
		 * TerceroDAO.findServicioDetalle((String
		 * )request.getSession().getAttribute("servicio"),s);
		 * serviciosList.add(servicio); }
		 */

		/*
		 * Inicio - Generacion de recibo del servicio
		 */
		Concepto concepto = (Concepto) request.getSession().getAttribute(
				"Concepto");
		String vinculacion = (String) request.getSession().getAttribute(
				"vinculacion");
		// String cod_servicio =
		// (String)request.getSession().getAttribute("servicio");
		PersonaCentro persona = (PersonaCentro) request.getSession()
				.getAttribute("tercero");
		Integer valor_total = (Integer) request.getSession().getAttribute(
				"valor_total");
		// long ide_persona =
		// (Long)request.getSession().getAttribute("ide_persona");
		// String cod_centro =
		// (String)request.getSession().getAttribute("centroCosto");
		Procedimientos procedimientos = new Procedimientos();
		Connection conn = null;
		;
		try {
			conn = ConexionDB.getInstance().getConnection();

			conn.setAutoCommit(false);
			String idu_documento = procedimientos.documentoCrear2(
					TerceroDAO.findByIdEntidad(Constantes.IDU_ENTIDAD),
					concepto.getNom_concepto(), valor_total,
					concepto.getCod_concepto(), persona.getIde_persona(), conn);
			// String idu_documento =
			// procedimientos.documentoCrear(Constantes.IDU_ENTIDAD,
			// cod_servicio, valor_total, ide_persona, cod_centro, conn);
			String resul = procedimientos.beneficiarios(idu_documento,
					Integer.parseInt(vinculacion), conn);
			for (Servicio ser : serviciosList) {
				procedimientos
						.liquidacion(idu_documento, ser.getCod_concepto(),
								persona.getIde_persona(), ser.getCod_centro(),
								Long.parseLong(ser.getIde_beneficiario()),
								ser.getValor_unitario(),
								ser.getCan_liquidacion(), conn);
			}

			procedimientos.documentoEstado(idu_documento, conn);

			conn.commit();

			try {

				File reportFile = null;
				Map parameters = new HashMap();

				/* Establecemos la ruta del reporte */
				reportFile = new File(
						request.getRealPath("recibos/RECIBOServicio.jasper"));

				/*
				 * No enviamos parámetros porque nuestro reporte no los
				 * necesita asi que escriba cualquier cadena de texto ya que
				 * solo seguiremos el formato del método runReportToPdf
				 */
				parameters.put("IDU_DOCUMENTO", idu_documento);
				// parameters.put("DOC_ESTUDIANTE", documento);
				// parameters.put("SEMESTRE", vigencia);

				/*
				 * Enviamos la ruta del reporte, los parámetros y la
				 * conexión(objeto Connection)
				 */
				byte[] bytes = JasperRunManager.runReportToPdf(
						reportFile.getPath(), parameters, conn);

				/* Indicamos que la respuesta va a ser en formato PDF */
				response.setContentType("application/pdf");
				response.setContentLength(bytes.length);
				ServletOutputStream ouputStream = response.getOutputStream();
				ouputStream.write(bytes, 0, bytes.length);

				/* Limpiamos y cerramos flujos de salida */
				ouputStream.flush();
			} catch (Exception e) {
				log.error(e);
				e.printStackTrace();
				for (StackTraceElement elem : e.getStackTrace()) {
					System.out.println(e.getMessage());
				}
			}

		} catch (NamingException e) {
			log.error(e.getMessage(),e);
			resultado = procedimientos.getMensajes(
					Constantes.COD_MENSAJE_GENERICO, conn);
			log.error(e.getMessage());
			try {
				conn.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			for (StackTraceElement elem : e.getStackTrace()) {
				log.error(elem.toString());
			}
		} catch (SQLException e) {
			try {
				e.printStackTrace();
				log.error(e.getMessage(),e);
				conn.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			if (e.getMessage().indexOf("[") != -1) {
				int error = Integer.parseInt(e.getMessage().substring(
						e.getMessage().indexOf("[") + 1,
						e.getMessage().indexOf("]")));
				resultado = procedimientos.getMensajes(error, conn);
			} else
				resultado = procedimientos.getMensajes(
						siafi.util.Constantes.COD_MENSAJE_GENERICO, conn);
			log.error(e.getMessage());
			for (StackTraceElement elem : e.getStackTrace())
				log.error(elem.toString());
		} catch (Exception e) {
			try {
				e.printStackTrace();
				log.error(e.getMessage(),e);
				conn.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			resultado = procedimientos.getMensajes(
					siafi.util.Constantes.COD_MENSAJE_GENERICO, conn);
			log.error(e.getMessage());
			for (StackTraceElement elem : e.getStackTrace()) {
				log.error(elem.toString());
			}
		} finally {
			try {
				conn.close();
			} catch (SQLException e) {
				log.error(e.getMessage(),e);
				for (StackTraceElement elem : e.getStackTrace()) {
					log.error(elem.toString());
				}
			}
		}

		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println(" <head>");
		out.println(" <link href=\"./css/coolblue.css\" rel=\"stylesheet\" type=\"text/css\"/>");
		out.println(" <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");
		out.println("  <title>Recibos</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("   <div align=\"center\" id=\"header\">");
		out.println(" <img src=\"./images/upn.jpg\"/>");
		out.println(" </div>");

		out.println(" <div align=\"center\" id=\"content\">");
		out.println("<label>" + resultado + "</label>");
		out.println("</div>");

		out.println(" <div align=\"right\" id=\"footer\" style=\"width: 80%\">");
		out.println("<img src=\"./images/SiafiReportes.bmp\" width=\"100px\" height=\"30px\"/>");
		out.println("</div>");

		out.println("</body>");
		out.println("</html>");

		out.close();
	}

}
